<?php 


/**
 * Função responsável pelo CRUD de registro de inscrições dos servidores.
 */
class Remanejamento_Model_Inscricao
{ 
    public $_tiposEtapas = array('user', 'etp1', 'etp2', 'etp3', 'etp4');
    
    
    /**
     * Inicializa as informações do servidor na sessão.
     * -- Evita informações desnecessárias no banco de dados.
     * -- Torna as informações mais reutilizaveis antes de salvar no banco de dados.
     * 
     * @param {string} [$etapa] (etp1|etp2|etp3|etp4)
     * @param {array} [$data] Informações do formulário do usuário
     */
    public function setSessaoInscricao($etapa, $data) 
    {          
        if (in_array($etapa, $this->_tiposEtapas)) {
            $tmpInscricao = new Zend_Session_Namespace('tmp_inscricao');
            $tmpInscricao->{$etapa} = isset($data['bootstrap']) ? $data['bootstrap'] : $data;
        } else {
            die('Nenhuma etapa válida foi informada.');
        }
    }
    
    /**
     * Recupera as informações já registradas na etapa informada.
     * -- Se a sessão não existir então o retorno será array() (vazio)
     * 
     * @para {string} [$etapa] (etp1|etp2|etp3|etp4)
     * @return array
     */
    public function getSessaoInscricao($etapa) 
    {
        $tmpInscricao = new Zend_Session_Namespace('tmp_inscricao');
        
        if (in_array($etapa, $this->_tiposEtapas)) {
            if (isset($tmpInscricao->{$etapa})) {
                return $tmpInscricao->{$etapa};
            } else {
                return array();
            }
        } else {
            die('Nenhuma etapa válida foi informada.');
        }
    }
    
    
    /**
     * Verifica, com base em getSessaoInscricao, qual a etapa que o usuário poderá acessar.
     * O retorno desta funçao sera um array de 3 chaves.
     *      - numSessoes
     *      - etapaMax
     * 
     * @return array $result 
     */
    public function verificarAcessoEtapa() 
    {
        $numSessoes = 0;
        
        foreach ($this->_tiposEtapas as $etapa) {
            if ($this->getSessaoInscricao($etapa) != array()) {
                ++$numSessoes;
            }
        }
        
        $etapaMax   = 'etapa' . ($numSessoes);        
        $result     = array('numSessoes' => $numSessoes, 
                            'etapaMax'   => $etapaMax);
        
        // Retornando informações...
        return $result;
    }
    
    
    /**
     * Verifica quais as possibilidades de inscrição para remanejamento de um determinado candidato
     * RN: Para fazer remanejamento Interno é necessário ter lotação definitiva na regional de lotação.
     *     Somente podem fazer remanejamento Interno/Externo quem possuir também lotação definitiva.
     *     Qualquer candidato pode fazer Remanejamento Externo
     * 
     * @return array $result
     * @todo remover os print_r da tela do usuário
     */
    public function verificarTpRemanejamento($admin=false) 
    {
        $sessao             = $this->getSessaoInscricao('etp1');
        $emp_dr1            = (int)trim($sessao['emp_dr']); 
        $emp_dr2            = (int)trim($sessao['emp_dr_sec']); 
        $empLotDefinitiva1  = (int)trim($sessao['emp_lot_definitiva']); 
        $empLotDefinitiva2  = (int)trim($sessao['emp_lot_definitiva_1']); 
        
        
        $result['']         = "Escolha uma opção";
        
        if ($empLotDefinitiva1 == 1 || $empLotDefinitiva2 == 1 || admin === true) {
            $result[1] = "Remanejamento Interno";
            $result[2] = "Remanejamento Externo";
            $result[3] = "Remanejamento Interno e Externo";
            
        } else if (($empLotDefinitiva1 == 0 && $emp_dr1 == '99') || ($empLotDefinitiva2 == 0 && $emp_dr2 == '99')) {
            unset($result[3]);
            $result[1] = "Remanejamento Interno";
            $result[2] = "Remanejamento Externo";
            
        } else {
            $result[2] = "Remanejamento Externo";
        }
        
        return $result; 
    }
    
    
    /**
     * Função que irá salvar todas as informações prestadas pelo docente que deverá
     * ser chamada a partir da etapa4
     * -- Somente será ativado na Etapa 4
     * -- Validações deverão ser feita nas respectivas etapas
     * 
     * @function finalizarInscricao
     * @param {object} [$data]
     * @return json $result
     */
    public function finalizarInscricao() 
    {
        try {
            $data   = $this->popularArray();
            $result = $this->salvarInscricao($data);            
            
        } catch (Bee_Exception $exc) {             
            $result = array('type'    => 'erro', 
                            'result'  => false,
                            'erro'    => $exc->getTraceAsString(),
                            'message' => 'finalizarInscricao(): Houve um problema interno e não foi possível salvar as informações de inscrição.'); 
        } 
          
        return $result; 
    }
    
    
    /**
     * Função que irá buscar o array multidimensional e salvar no banco de dados..
     * 
     * @param {array} [$data]
     * @return {array} [result]
     */
    private function salvarInscricao($data) 
    {   
        try {
            // Iniciando variáveis importantes
            $tblInscricoes  = new Remanejamento_Model_DbTable_Remanejamento_Inscricoes();
            $erro           = 0;
            
            foreach ($data as $inscricao) {
                $row    = $tblInscricoes->createRow($inscricao);
                $result = $row->save();
                
                if ($result == '0') {
                    $erro++;
                }
            }
            
            if ($erro == 0) {
                $result = array('type'    => 'success', 
                                'result'  => true,
                                'message' => 'Informações salvas com sucesso.'); 
            } else {
                $result = array('type'    => 'erro', 
                                'result'  => false,
                                'message' => 'salvarInscricao(): Uma ou mais opções não foram salvas no banco de dados. Ente em contato com SEEDF/Regional para maiores informações..');
            }
            
        } catch (Exception $exc) {
            $result = array('type'    => 'erro', 
                            'result'  => false,
                            'erro'    => $exc->getTraceAsString(),
                            'msgErro' => $exc->getMessage(),
                            'message' => 'salvarInscricao(): Houve um problema interno e não foi possível salvar as informações da inscricao.'); 
        }

        return $result;
    }
    
    
    /**
     * função que irá popular e documentar as informações necessárias para realizar um remanejamento.
     * -- Todas as informações deverão vir de Zend_Session
     * -- Todas as keys do $result são replicas do BD
     * 
     * @return $result;
     */
    private function popularArray() 
    {
        $modelInsc  = new Remanejamento_Model_Inscricao();
        $etp1       = $modelInsc->getSessaoInscricao('etp1');
        $etp2       = $modelInsc->getSessaoInscricao('etp2');
        $etp3       = $modelInsc->getSessaoInscricao('etp3');
        $etp4       = $modelInsc->getSessaoInscricao('etp4');
        $num        = 0;
        $result     = array();
        $empDr      = 0;
        
        foreach ($etp2['habilitacoes'] as $keyHab => $habilitacoes) {
            foreach ($etp4['cordenacaoEnsino'] as $keyEns => $cordEnsino) {
                ++$num;    
                $coEn   = explode('_', $cordEnsino);
                $dirReg = $coEn[0]; // tua_dr
                $subCo  = $coEn[1]; // tua_subcodigo
                $empDr  = ($etp1['emp_dr'] != $empDr) ? $etp1['emp_dr'] : $etp1['emp_dr_sec'];

                // Remove inscrições que não podem ser realizadas.
                if ($this->verificarInscricao($dirReg, $subCo, $empDr)) {
                    //$result[$num]['ins_codigo']                 = ''; // Gerado automaticamente
                    $result[$num]['ins_cd_matricula']           = $etp1['matricula'];       // Matrícula do professor
                    $result[$num]['ins_emp_dr']                 = $empDr;                   // Código da Regional
                    $result[$num]['ins_reg_escolha']            = $dirReg;                  // Qual regional foi escolhida (Ceilandia, taguatinga..)
                    $result[$num]['ins_reg_escolha_sub']        = $subCo;                   // Qual Sub Categoria da Regional escolhida (1-Urbano/2-Rural)
                    $result[$num]['ins_op_regional']            = $keyEns;                  // Indica a ordem de opção
                    $result[$num]['ins_cd_disciplina']          = $habilitacoes;            // Quais foram as habilitações que o candidato escolheu
                    $result[$num]['ins_op_disciplina']          = $keyHab;                  // Indica a ordem de opção da disciplina NUMERIC
                    $result[$num]['ins_tempo_servico']          = $etp1['tempoServico'];    // Saber quantos dias efetivos o candidato trabalhou
                    $result[$num]['ins_adic_endereco']          = NULL;                     // Adicional de Endereço (0 – zero ou 20 –vinte) NUMERIC 5 ***                    // 
                    $result[$num]['ins_adic_nec_esp']           = $this->adicionalNecEspeciais($etp1['pne'], $etp1['tempoServico']);                     // Adicional de Necessidade Especial (0 – zero ou 20 –vinte) NUMERIC 5 ***
                    $result[$num]['ins_adic_zonarural']         = $this->adicionalZonaRural($subCo, $etp1['tempoServico']);                     // Adicional de Zona Rural (0 – zero ou 20 –vinte)
                    $result[$num]['ins_st_inscricao']           = '2';                      // Situação da inscrição (1 – válida e 2 – inválida) Todas começam inválida
                    $result[$num]['ins_cd_mot_invalida']        = NULL;                     // Código do motivo de invalidação (tabela motivo_invalida)
                    $result[$num]['ins_tp_concurso']            = $etp4['tpRemanejamento']; // Tipo do concurso (1 – interno, 2 – Externo, 3 - Interno/externo )
                    $result[$num]['ins_class_provisoria']       = NULL;                     // Classificação provisória
                    $result[$num]['ins_class_definitiva']       = NULL;                     // Classificação definitiva
                    $result[$num]['ins_pont_provisoria']        = NULL;                     // Pontuação provisória
                    $result[$num]['ins_pont_definitiva']        = NULL;                     // Pontuação definitiva
                    $result[$num]['ins_cd_disciplina_reclass']  = NULL;                     // Em desuso
                    $result[$num]['ins_st_remocao']             = NULL;                     // 1 – Removido, 2 – Desistiu, 3 – Não Compareceu, 4 – Já Removido, 5 – Removido Sem Bloqueio, 6 – Já Reservou carência, 7 – Não pode bloquear
                    $result[$num]['ins_dt_status']              = NULL;                     // Data da situação DATETIME 8 AAAA/MM/DD - HH:MM:SS:MLMLML
                    $result[$num]['ins_class_geral']            = NULL;                     // Classifição geral
                    $result[$num]['data_inclusao']              = date("Y-m-d h:i:s");      // 
                    $result[$num]['ano_remanejamento']          = date("Y");                // 
                }
            }
        }
        
        return $result;                
    }
    
    
    /**
     * função que irá verificar se as informações passadas no momento da inscrição
     * são válidas. Exemplo de exclusão quem esta em uma dr 99 não poderá fazer remanejamento
     * interno, pois já é considerado desvio de função.
     * 
     * @param {string} [$dirReg] Saber qual é a escolha do candidato para remanejamento
     * @param {string} [$subCo] Saber se é Rural ou Urbana
     * @param {string} [$empDr] Regional do candidato
     */
    private function verificarInscricao($dirReg, $subCo, $empDr) 
    {
        /**
         * Nenhuma regra foi informada, esta função irá ajudar a eliminar as diversas inscrições que não são válidas.
         */
        return true;
    }
    
    
    /**
     * Função que irá retornar o valor do adicional para cara candidato
     * 
     * @param {type} [$enderecoAtual] Verifica o endereço pessoal da pessoa
     * @param {type} [$drEscolha] Verifica se o endereço informado é igual ao pessoal
     * @param {type} [$tmpServ] Tempo de serviço, para somar caso seja necessário
     * @param {type} [$tpRemanejamento] saber se é interno ou externo
     * @return {int} valor, com base na porcentagem sobre o tempo de serviço
     */
    public function adicionalEndereco($enderecoAtual, $drEscolha, $tmpServ, $tpRemanejamento) 
    {
        $result = 0;
        
        if (($enderecoAtual == $drEscolha) && ($tpRemanejamento == 2) ) {
            $result = round($tmpServ * 0.2);
        }
        
        return $result; 
    }
    
    /**
     * Verifica se o candidato é portador de necessidades especiais e acresce 20% nos pontos.
     * 
     * @param {string} [$necessidade] Verifica se é portador (1 = sim, 0 = Nao)
     * @param {string} [$tmpServ] Tempo de serviço para base de calculo
     * @return {int} valor, com base na porcentagem sobre o tempo de serviço
     */
    public function adicionalNecEspeciais($necessidade, $tmpServ) 
    {
        $result = 0;
        
        if (($necessidade == 1)) {
            $result = round($tmpServ * 0.2);
        }
        
        return (float)$result; 
    }
    
    
    /**
     * Verifica se o candidato escolheu um local do tipo Zona Rural
     * 
     * @param type $tpRegional
     * @param type $tmpServ
     * @return type
     */
    public function adicionalZonaRural($tpRegional, $tmpServ) 
    {
        $result = 0;
        
        if (($tpRegional == 2)) {
            $result = round($tmpServ * 0.2);
        }
        
        return $result;
    }
    
    
    /**
     * Busca Habilidades escolhidas pelo candidato na inscricao.
     * -- Busca da tabela de inscrições já realizadas
     * 
     * @param string $cdMatricula
     * @return array $result
     */
    public function buscarHabilitacoesCandidato($cdMatricula, $ano=2013) 
    {
        try {
            $tblInscr = new Remanejamento_Model_DbTable_Remanejamento_Inscricoes();
            $slcInscr = $tblInscr->select();
            $slcInscr->from(array('ins' => 'inscricoes'), array('ins.ins_cd_disciplina'), 'remanejamento')
                     ->joinLeft(array('hab' => 'habilitacoes'), 'ins.ins_cd_disciplina = hab.thb_cd_habilit', array('hab.tbh_nome', 'hab.thb_cd_habilit'), 'sigrh')
                     ->setIntegrityCheck(false)
                     ->where('ins.ins_cd_matricula = ?', $cdMatricula)
                     ->where('ins.ano_remanejamento = ?', $ano);
            $result = $tblInscr->fetchAll($slcInscr);

            if (!empty($result)) {
                $result = $result->toArray();
            }

            return $result;
            
        } catch (Exception $exc) {
            die('Erro na função buscarHabilitacoesCandidato');
        }
    }
    
    
    /**
     * Busca informações referenes as CRE's escolhidas pelo usuário no momento da inscrição
     * -- Busca da tabela de inscrições já realizadas.
     * 
     * @param string $cdMatricula
     * @return array $result
     */
    public function buscarCresCandidato($cdMatricula, $ano) 
    {
        try {
            $tblInscr = new Remanejamento_Model_DbTable_Remanejamento_Inscricoes();
            $slcInscr = $tblInscr->select();
            $slcInscr->from(array('ins' => 'inscricoes'), array('ins.ins_cd_disciplina', 'ins.ins_tp_concurso', 'ins.data_inclusao'), 'remanejamento')
                     ->joinLeft(array('ua' => 'unidades_administrativas'), 'ins.ins_reg_escolha = ua.tua_dr and ins.ins_reg_escolha_sub = ua.tua_subcodigo', array('ua.tua_dr', 'ua.tua_subcodigo', 'ua.tua_descricao'), 'sigrh')
                     ->setIntegrityCheck(false)
                     ->where('ins.ins_cd_matricula = ?', $cdMatricula)
                     ->where('ins.ano_remanejamento = ?', $ano);
            $result = $tblInscr->fetchAll($slcInscr);

            if (!empty($result)) {
                $result = $result->toArray();
            }
            
            return $result;
            
        } catch (Exception $exc) {
            die('Erro na função buscarCresCandidato');
        }
    }
    
    
    /**
     * Pelas regras de negócio o candidato poderá fazer apenas uma inscrição.
     * Caso o mesmo tente fazer uma segunda inscrição será avisado...
     * 
     * @param {string} [$cdMatricula]
     * @param {string} [$ano]
     * @return {boolean}
     */
    public function verificaExistenciaInscricao($cdMatricula, $ano) 
    {
        try {
            
            // Verifica se houve informações vindas da controller...
            if (!empty($cdMatricula)) {
                $tblInscr = new Remanejamento_Model_DbTable_Remanejamento_Inscricoes();
                $slcInscr = $tblInscr->select();
                $slcInscr->from(array('ins' => 'inscricoes'), array('count(ins.ins_codigo) as inscricao'), 'remanejamento')
                         ->where('ins.ins_cd_matricula = ?', $cdMatricula)
                         ->where('ins.ano_remanejamento = ?', $ano);
                $result = $tblInscr->fetchRow($slcInscr);

                if (!empty($result)) {
                    $result = $result->toArray();
                }

                if ($result['inscricao'] >= 1 ) {
                    return true;
                    
                } else {
                    return false;
                }
            }
            
        } catch (Exception $exc) {
            echo $exc->getTraceAsString();
        }
    }
    
    
    /**
     * Lista as inscrições do candidato de acordo com a matrícula
     * 
     * @param string $matricula
     * @return {array} result
     */
    public function listarInscricoes($matricula, $ano) 
    {
        try {
            $tblInscr   = new Remanejamento_Model_DbTable_Remanejamento_Inscricoes();
            $result     = array();
            
            $select = $tblInscr->select();
            $select->from(array('ins' => 'inscricoes'), array("ins.ins_codigo", "ins.ins_cd_matricula", "ins.ins_emp_dr", "ins.ins_reg_escolha", "ins.ins_reg_escolha_sub",
                                                                          "ins.ins_op_regional", "ins.ins_cd_disciplina", "ins.ins_op_disciplina", "ins.ins_tempo_servico", "ins.ins_adic_endereco",
                                                                          "ins.ins_adic_nec_esp", "ins.ins_adic_zonarural", "ins.ins_st_inscricao", "ins.ins_cd_mot_invalida", "ins.ins_tp_concurso",
                                                                          "ins.ins_class_provisoria", "ins.ins_class_definitiva", "ins.ins_pont_provisoria", "ins.ins_pont_definitiva",
                                                                          "ins.ins_cd_disciplina_reclass", "ins.ins_st_remocao", "ins.ins_dt_status", "ins.ins_class_geral", "ins.data_inclusao",
                                                                          "ins.ano_remanejamento"), 'remanejamento')
                   ->joinLeft(array('emp' => 'empregados'), 'ins.ins_cd_matricula = emp.emp_cd_matricula', array('emp.emp_nome'), 'sigrh')
                   ->joinLeft(array('ua' => 'unidades_administrativas'), 'ins.ins_reg_escolha = ua.tua_dr and ins.ins_reg_escolha_sub = ua.tua_subcodigo', array('ua.tua_dr', 'ua.tua_subcodigo', 'ua.tua_descricao'), 'sigrh')
                   ->joinLeft(array('hab' => 'habilitacoes'), 'ins.ins_cd_disciplina = hab.thb_cd_habilit', array('hab.tbh_nome', 'hab.thb_cd_habilit'), 'sigrh')
                   ->setIntegrityCheck(false)
                   ->where("ins.ins_cd_matricula = ?", $matricula)
                   ->where("ins.ano_remanejamento = ?", $ano);
            
            $result = $tblInscr->fetchAll($select);
            
            if (!empty($result)) {
                $result = $result->toArray();
            }
            
            return $result;
            
        } catch (Exception $exc) {
            echo $exc->getTraceAsString();
        }
    }
    
    
    
    /**
     * utilizado para fazer teste de conexão com o banco informix da IBM
     * -- Verificar se existem drivers disponívels para esta conexão
     */
    public function testeinformix() 
    {
        $tblPessoa = new Remanejamento_Model_DbTable_DbGestao_DsEmpregado();
        $slcPessoa = $tblPessoa->select();
        $slcPessoa->from(array('emp' => 'ds_empregado'), array('*'), 'db_gestao');
        
        echo $slcPessoa;
        die();
    }
    
    
}
